ãã¹ããããJavaScriptãªããžã§ã¯ããå®å šã«å€æŽããç§èš£ãè§£ãæãããŸãããã®ã¬ã€ãã§ã¯ããªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ããªãæ©èœãšããŠååšããªãã®ããæãäžããææ°ã®ã¬ãŒãå¥ãã`||=`ã`??=`ã䜿ã£ããã¹äœæãŸã§ããšã©ãŒã®ãªãã³ãŒããæžãããã®å ç¢ãªãã¿ãŒã³ã玹ä»ããŸãã
JavaScriptã®ãªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ïŒå®å šãªããããã£å€æŽã培åºè§£èª¬
JavaScriptãããçšåºŠã®æéæ±ã£ãŠããã°ãã¢ããªã±ãŒã·ã§ã³ã忢ãããŠããŸãæããããšã©ãŒã"TypeError: Cannot read properties of undefined"ã«ééããªãééããããšãããã§ãããããã®ãšã©ãŒã¯ãç§ãã¡ããªããžã§ã¯ãã ãšæã£ãŠããå€ã`undefined`ã§ããããšã倿ãããã®ããããã£ã«ã¢ã¯ã»ã¹ããããšãããšãã«çºçãããå žåçãªééå瀌ã§ãã
ES2020仿§ã®ã¢ãã³JavaScriptã¯ãããããã£ã®èªã¿åãã«é¢ãããã®åé¡ã«å¯ŸåŠããããã®åŒ·åã§ãšã¬ã¬ã³ããªããŒã«ããªãã·ã§ãã«ãã§ã€ãã³ã°æŒç®å (`?.`) ãç§ãã¡ã«äžããŸãããããã«ãããæ·±ããã¹ããããé²åŸ¡çãªã³ãŒãã¯ãã¯ãªãŒã³ãª1è¡ã®åŒãžãšå€ãããŸããããã®ããšã¯ãäžçäžã®éçºè ãæ±ãæ¬¡ã®çåã«èªç¶ãšç¹ãããŸããããããã£ãå®å šã«èªã¿åããã®ã§ããã°ãå®å šã«æžã蟌ãããšãã§ããã®ã ãããïŒããªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ãã®ãããªããšã¯ã§ããªãã®ã ãããïŒ
ãã®ç·åã¬ã€ãã§ã¯ããŸãã«ãã®çåãæ¢æ±ããŸãããªããã®äžèŠã·ã³ãã«ãªæäœãJavaScriptã®æ©èœã§ã¯ãªãã®ããæ·±ãæãäžããããã«éèŠãªããšã«ãåãç®æšãéæããããã®å ç¢ãªãã¿ãŒã³ãšææ°ã®æŒç®åãæããã«ããŸããããã¯ãæœåšçã«ååšããªããã¹ããããããããã£ã®å®å šã§å埩åã®ããããšã©ãŒã®ãªã倿Žã§ããããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã§è€éãªç¶æ ã管çããŠããå Žåã§ããAPIããŒã¿ãåŠçããŠããå Žåã§ããå ç¢ãªããã¯ãšã³ããµãŒãã¹ãæ§ç¯ããŠããå Žåã§ãããããã®ãã¯ããã¯ãç¿åŸããããšã¯çŸä»£ã®éçºã«ãšã£ãŠäžå¯æ¬ ã§ãã
ããããïŒãªãã·ã§ãã«ãã§ã€ãã³ã° (`?.`) ã®å
ä»£å ¥ã«åãçµãåã«ããªãã·ã§ãã«ãã§ã€ãã³ã°æŒç®å (`?.`) ããªãããã»ã©äžå¯æ¬ ãªã®ããç°¡åã«ããããããŸãããããã®äž»ãªæ©èœã¯ãçµåããããªããžã§ã¯ããã§ãŒã³ã®å¥¥æ·±ãã«ããããããã£ãžã®ã¢ã¯ã»ã¹ãããã§ãŒã³å ã®åãªã³ã¯ãæç€ºçã«æ€èšŒããããšãªãç°¡çŽ åããããšã§ãã
äžè¬çãªã·ããªãªãèããŠã¿ãŸããããè€éãªãŠãŒã¶ãŒãªããžã§ã¯ããããŠãŒã¶ãŒã®çªå°ãååŸããã±ãŒã¹ã§ãã
åŸæ¥ã®æ¹æ³ïŒåé·ã§ç¹°ãè¿ãã®ãã§ãã¯
ãªãã·ã§ãã«ãã§ã€ãã³ã°ããªãå Žåãäžéãããã㣠(`profile` ã `address`) ã®ãããããæ¬ èœããŠãããš `TypeError` ãé²ãããã«ããªããžã§ã¯ãã®åã¬ãã«ããã§ãã¯ããå¿ èŠããããŸããã
ã³ãŒãäŸïŒ
const user = { id: 101, name: 'Alina', profile: { // address is missing age: 30 } }; let street; if (user && user.profile && user.profile.address) { street = user.profile.address.street; } console.log(street); // åºå: undefined (ãããŠãšã©ãŒãªãïŒ)
ãã®ãã¿ãŒã³ã¯å®å šã§ã¯ãããã®ã®ãç ©éã§èªã¿ã«ãããç¹ã«ãªããžã§ã¯ãã®ãã¹ããæ·±ããªãã«ã€ããŠç®¡çãé£ãããªããŸãã
çŸä»£çãªæ¹æ³ïŒ`?.` ã䜿ã£ãŠã¯ãªãŒã³ãã€ç°¡æœã«
ãªãã·ã§ãã«ãã§ã€ãã³ã°æŒç®åã䜿çšãããšãäžèšã®ãã§ãã¯ã1è¡ã§éåžžã«èªã¿ãããæžãçŽãããšãã§ããŸããããã¯ã`?.` ã®åã®å€ã `null` ãŸã㯠`undefined` ã®å Žåãããã«è©äŸ¡ã忢ã㊠`undefined` ãè¿ãããšã§æ©èœããŸãã
ã³ãŒãäŸïŒ
const user = { id: 101, name: 'Alina', profile: { age: 30 } }; const street = user?.profile?.address?.street; console.log(street); // åºå: undefined
ãã®æŒç®åã¯ã颿°åŒã³åºã (`user.calculateScore?.()`) ãé åã¢ã¯ã»ã¹ (`user.posts?.[0]`) ã§ã䜿çšã§ããå®å šãªããŒã¿ååŸã®ããã®å€çšéãªããŒã«ãšãªã£ãŠããŸãããã ãããã®æ§è³ªãèŠããŠããããšãéèŠã§ããããã¯èªã¿åãå°çšã®ã¡ã«ããºã ã§ãã
究極ã®çåïŒãªãã·ã§ãã«ãã§ã€ãã³ã°ã§ä»£å ¥ã§ãããïŒ
ããããä»åã®ãããã¯ã®æ žå¿ã§ãããã®éåžžã«äŸ¿å©ãªæ§æãä»£å ¥ã®å·ŠåŽã«äœ¿çšããããšãããšã©ããªãã§ããããïŒ
ãŠãŒã¶ãŒã®ã¢ãã¬ã¹ãæŽæ°ããããšããŸããããã¹ãååšããªãå¯èœæ§ããããšããŸãã
ã³ãŒãäŸïŒããã¯å€±æããŸãïŒïŒ
const user = {}; // ããããã£ãå®å šã«ä»£å ¥ããããšè©Šã¿ã user?.profile?.address = { street: '123 Global Way' };
ãã®ã³ãŒããçŸä»£ã®JavaScriptç°å¢ã§å®è¡ãããšã`TypeError` ã§ã¯ãªããç°ãªãçš®é¡ã®ãšã©ãŒã«ééããã§ãããã
Uncaught SyntaxError: Invalid left-hand side in assignment
ãªããããæ§æãšã©ãŒãªã®ãïŒ
ããã¯ã©ã³ã¿ã€ã ã®ãã°ã§ã¯ãããŸãããJavaScriptãšã³ãžã³ã¯ãå®è¡ããããšããåã«ãããç¡å¹ãªã³ãŒããšããŠèå¥ããŸãããã®çç±ã¯ãããã°ã©ãã³ã°èšèªã®åºæ¬çãªæŠå¿µãlvalueïŒå·ŠèŸºå€ïŒãšrvalueïŒå³èŸºå€ïŒã®åºå¥ã«ãããŸãã
- lvalueã¯ã¡ã¢ãªäžã®å Žæãã€ãŸãå€ãæ ŒçŽã§ãããå®å ãã衚ããŸãã倿° (`x`) ããªããžã§ã¯ããããã㣠(`user.name`) ã®ãããªã³ã³ãããšèããŠãã ããã
- rvalueã¯ãlvalueã«ä»£å ¥ã§ããçŽç²ãªå€ã衚ããŸããããã¯ãæ°å€ `5` ãæåå `"hello"` ã®ãããªãã³ã³ãã³ããã§ãã
åŒ `user?.profile?.address` ã¯ãã¡ã¢ãªäžã®å Žæãæãããšãä¿èšŒããŸããããã `user.profile` ã `undefined` ã§ããã°ãåŒã¯ã·ã§ãŒããµãŒãããããå€ `undefined` ã«è©äŸ¡ãããŸãã`undefined` ãšããå€ã«äœããä»£å ¥ããããšã¯ã§ããŸãããããã¯ãŸãã§ãéµäŸ¿é éå¡ã«ãååšããªãããšããæŠå¿µã«è·ç©ãå±ãããããªãã®ã§ãã
ä»£å ¥ã®å·ŠèŸºã¯æå¹ã§æç¢ºãªåç §ïŒlvalueïŒã§ããå¿ èŠãããããªãã·ã§ãã«ãã§ã€ãã³ã°ã¯å€ (`undefined`) ãçæããå¯èœæ§ããããããææ§ããšã©ã³ã¿ã€ã ãšã©ãŒãé²ãããã«ããã®æ§æã¯å®å šã«çŠæ¢ãããŠããŸãã
éçºè ã®ãžã¬ã³ãïŒå®å šãªããããã£ä»£å ¥ã®å¿ èŠæ§
æ§æããµããŒããããŠããªããããšãã£ãŠããã®å¿ èŠæ§ããªããªãããã§ã¯ãããŸãããæ°ããããªãã»ã©ã®çŸå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹å šäœãååšãããã©ããã確å®ã«ç¥ããªããŠããæ·±ããã¹ãããããªããžã§ã¯ãã倿Žããå¿ èŠããããŸããäžè¬çãªã·ããªãªã¯æ¬¡ã®ãšããã§ãã
- UIãã¬ãŒã ã¯ãŒã¯ã§ã®ç¶æ 管çïŒReactãVueã®ãããªã©ã€ãã©ãªã§ã³ã³ããŒãã³ãã®ç¶æ ãæŽæ°ããéãå ã®ç¶æ ããã¥ãŒããŒã·ã§ã³ããã«ãæ·±ããã¹ããããããããã£ã倿Žããå¿ èŠãããããšããããããŸãã
- APIå¿çã®åŠçïŒAPIã¯ãªãã·ã§ã³ãã£ãŒã«ããæã€ãªããžã§ã¯ããè¿ãããšããããŸããã¢ããªã±ãŒã·ã§ã³ã¯ããã®ããŒã¿ãæ£èŠåããããããã©ã«ãå€ã远å ãããããå¿ èŠãããå ŽåããããŸããããã«ã¯ãæåã®å¿çã«ååšããªãå¯èœæ§ã®ãããã¹ãžã®ä»£å ¥ãå«ãŸããŸãã
- åçãªèšå®ïŒç°ãªãã¢ãžã¥ãŒã«ãç¬èªã®èšå®ã远å ã§ããèšå®ãªããžã§ã¯ããæ§ç¯ããã«ã¯ããã¹ããããæ§é ããã®å Žã§å®å šã«äœæããå¿ èŠããããŸãã
ããšãã°ãèšå®ãªããžã§ã¯ãããããããŒãã®è²ãèšå®ããããã`theme` ãªããžã§ã¯ãããŸã ååšãããã©ããããããªããšããŸãã
ç®æšïŒ
const settings = {}; // ãšã©ãŒãªãã§ãããå®çŸãããïŒ settings.ui.theme.color = 'blue'; // äžèšã®è¡ã¯ãTypeError: Cannot set properties of undefined (setting 'theme')ããã¹ããŒããŸã
ã§ã¯ããããã©ã解決ããã°ããã§ããããïŒçŸä»£ã®JavaScriptã§å©çšã§ãããããã€ãã®åŒ·åã§å®çšçãªãã¿ãŒã³ãæ¢ã£ãŠã¿ãŸãããã
JavaScriptã«ãããå®å šãªããããã£å€æŽã®ããã®æŠç¥
çŽæ¥çãªããªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ãæŒç®åã¯ååšããŸããããæ¢åã®JavaScriptæ©èœãçµã¿åãããŠåãçµæãéæã§ããŸããæãåºæ¬çãªãã®ãããããé«åºŠã§å®£èšçãªè§£æ±ºçãžãšé²ãã§ãããŸãããã
ãã¿ãŒã³1ïŒå€å žçãªãã¬ãŒãå¥ãã¢ãããŒã
æãç°¡åãªæ¹æ³ã¯ãä»£å ¥ãè¡ãåã«ããã§ãŒã³å ã®åããããã£ã®ååšãæåã§ãã§ãã¯ããããšã§ããããã¯ES2020以åã®ããæ¹ã§ãã
ã³ãŒãäŸïŒ
const user = { profile: {} }; // ãã¹ãååšããå Žåã«ã®ã¿ä»£å ¥ããã if (user && user.profile && user.profile.address) { user.profile.address.street = '456 Tech Park'; }
- é·æïŒéåžžã«æç€ºçã§ãã©ã®éçºè ã«ãšã£ãŠãçè§£ããããããã¹ãŠã®JavaScriptããŒãžã§ã³ãšäºææ§ããããŸãã
- çæïŒéåžžã«åé·ã§å埩çãæ·±ããã¹ãããããªããžã§ã¯ãã§ã¯ç®¡çäžèœã«ãªãããªããžã§ã¯ãçã®ãã³ãŒã«ããã¯å°çããšããåŒã°ããç¶æ ã«é¥ããŸãã
ãã¿ãŒã³2ïŒãã§ãã¯ã«ãªãã·ã§ãã«ãã§ã€ãã³ã°ã掻çšãã
å€å žçãªã¢ãããŒãã¯ã`if` ã¹ããŒãã¡ã³ãã®æ¡ä»¶éšåã«ãæã ã®å人ã§ãããªãã·ã§ãã«ãã§ã€ãã³ã°æŒç®åã䜿çšããããšã§ãå€§å¹ ã«æŽçã§ããŸããããã«ãããå®å šãªèªã¿åããšçŽæ¥ã®æžã蟌ã¿ãåé¢ãããŸãã
ã³ãŒãäŸïŒ
const user = { profile: {} }; // 'address' ãªããžã§ã¯ããååšããå Žåãçªå°ãæŽæ°ãã if (user?.profile?.address) { user.profile.address.street = '456 Tech Park'; }
ããã¯å¯èªæ§ã«ãããŠå€§ããªæ¹åã§ãããã¹å šäœãäžåºŠã«å®å šã«ãã§ãã¯ããŸãããã¹ãååšããå ŽåïŒã€ãŸããåŒã `undefined` ãè¿ããªãå ŽåïŒãä»£å ¥ã«é²ã¿ãŸããããã§ä»£å ¥ãå®å šã§ããããšãããããŸãã
- é·æïŒå€å žçãªã¬ãŒãå¥ãããã¯ããã«ç°¡æœã§èªã¿ããããããã®ãã¹ãæå¹ã§ããã°ãæŽæ°ãå®è¡ããããšããæå³ãæç¢ºã«è¡šçŸãããŸãã
- çæïŒäŸç¶ãšããŠ2ã€ã®å¥ã ã®ã¹ãããïŒãã§ãã¯ãšä»£å ¥ïŒãå¿ èŠã§ããæ±ºå®çã«éèŠãªã®ã¯ããã®ãã¿ãŒã³ã¯ãã¹ãååšããªãå Žåã«ãã¹ãäœæããªãããšã§ããæ¢åã®æ§é ã®ã¿ãæŽæ°ããŸãã
ãã¿ãŒã³3ïŒããã®å Žã§æ§ç¯ããã¹äœæïŒè«çä»£å ¥æŒç®åïŒ
æŽæ°ããã ãã§ãªããå¿ èŠã«å¿ããŠãã¹ãäœæããŠãã¹ãååšããããšãä¿èšŒããããšãç®æšã®å Žåã¯ã©ãã§ããããïŒããã§è«çä»£å ¥æŒç®åïŒES2021ã§å°å ¥ïŒãèŒããæŸã¡ãŸãããã®ã¿ã¹ã¯ã§æãäžè¬çãªã®ã¯è«çORä»£å ¥ (`||=`)ã§ãã
åŒ `a ||= b` 㯠`a = a || b` ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã§ããããã¯ãããã `a` ãåœå€ïŒ`undefined`ã`null`ã`0`ã`''` ãªã©ïŒã§ããã°ã`b` ã `a` ã«ä»£å ¥ããããšããæå³ã§ãã
ãã®åäœãé£éãããŠããªããžã§ã¯ãã®ãã¹ã段éçã«æ§ç¯ã§ããŸãã
ã³ãŒãäŸïŒ
const settings = {}; // è²ãä»£å ¥ããåã« 'ui' ããã³ 'theme' ãªããžã§ã¯ããååšããããšã確èªãã (settings.ui ||= {}).theme ||= {}; settings.ui.theme.color = 'darkblue'; console.log(settings); // åºå: { ui: { theme: { color: 'darkblue' } } }
ä»çµã¿ïŒ
- `settings.ui ||= {}`: `settings.ui` 㯠`undefined` (åœå€) ãªã®ã§ãæ°ãã空ã®ãªããžã§ã¯ã `{}` ãä»£å ¥ãããŸããåŒå šäœ `(settings.ui ||= {})` ã¯ãã®æ°ãããªããžã§ã¯ãã«è©äŸ¡ãããŸãã
- `{}.theme ||= {}`: æ°ããäœæããã `ui` ãªããžã§ã¯ãã® `theme` ããããã£ã«ã¢ã¯ã»ã¹ããŸããããã `undefined` ãªã®ã§ãæ°ãã空ã®ãªããžã§ã¯ã `{}` ãä»£å ¥ãããŸãã
- `settings.ui.theme.color = 'darkblue'`: `settings.ui.theme` ã®ãã¹ãååšããããšãä¿èšŒãããã®ã§ãå®å šã« `color` ããããã£ãä»£å ¥ã§ããŸãã
- é·æïŒèŠæ±ã«å¿ããŠãã¹ããããæ§é ãäœæããã®ã«éåžžã«ç°¡æœã§åŒ·åãçŸä»£ã®JavaScriptã§ã¯éåžžã«äžè¬çã§æ £çšçãªãã¿ãŒã³ã§ãã
- çæïŒå ã®ãªããžã§ã¯ããçŽæ¥ãã¥ãŒããŒã·ã§ã³ããããã颿°åããã°ã©ãã³ã°ãã€ãã¥ãŒã¿ãã«ããã°ã©ãã³ã°ã®ãã©ãã€ã ã§ã¯æãŸãããªãå ŽåããããŸããè«çä»£å ¥æŒç®åã«äžæ £ããªéçºè ã«ãšã£ãŠã¯ãæ§æãå°ãé£è§£ã«æãããããããããŸããã
ãã¿ãŒã³4ïŒãŠãŒãã£ãªãã£ã©ã€ãã©ãªãçšãã颿°åããã³ã€ãã¥ãŒã¿ãã«ãªã¢ãããŒã
å€ãã®å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ãç¹ã«Reduxã®ãããªç¶æ 管çã©ã€ãã©ãªã䜿çšããããReactã®ç¶æ ã管çãããããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã€ãã¥ãŒã¿ããªãã£ãæ žãšãªãååã§ãããªããžã§ã¯ããçŽæ¥ãã¥ãŒããŒã·ã§ã³ãããšãäºæž¬äžèœãªåäœã远跡ãå°é£ãªãã°ã«ã€ãªããå¯èœæ§ããããŸãããã®ãããªå Žåãéçºè ã¯LodashãRamdaã®ãããªãŠãŒãã£ãªãã£ã©ã€ãã©ãªã«é ŒãããšããããããŸãã
Lodashã¯ããã®åé¡ã®ããã«ç¹å¥ã«æ§ç¯ããã `_.set()` 颿°ãæäŸããŸããããã¯ããªããžã§ã¯ããæååãã¹ãå€ãåãåãããã®ãã¹ã«å®å šã«å€ãèšå®ããå¿ èŠã«å¿ããŠãã¹ãããããªããžã§ã¯ããäœæããŸãã
Lodashãçšããã³ãŒãäŸïŒ
import { set } from 'lodash-es'; const originalUser = { id: 101 }; // _.setã¯ããã©ã«ãã§ãªããžã§ã¯ãããã¥ãŒããŒã·ã§ã³ããŸãããã€ãã¥ãŒã¿ããªãã£ã®ããã«ã¯ããŒã³ãšå ±ã«äœ¿çšãããããšãå€ãã§ãã const updatedUser = set(JSON.parse(JSON.stringify(originalUser)), 'profile.address.street', '789 API Boulevard'); console.log(originalUser); // åºå: { id: 101 } (倿Žãªã) console.log(updatedUser); // åºå: { id: 101, profile: { address: { street: '789 API Boulevard' } } }
- é·æïŒéåžžã«å®£èšçã§èªã¿ããããæå³ (`set(object, path, value)`) ãéåžžã«æç¢ºã§ããè€éãªãã¹ïŒ`'posts[0].title'` ã®ãããªé åã€ã³ããã¯ã¹ãå«ãïŒãå®ç§ã«åŠçããŸããã€ãã¥ãŒã¿ãã«ãªæŽæ°ãã¿ãŒã³ã«å®å šã«é©åããŸãã
- çæïŒãããžã§ã¯ãã«å€éšäŸåé¢ä¿ãå°å ¥ãããŸãããã®æ©èœããå¿ èŠãªãå Žåã¯ããªãŒããŒãã«ãããããŸããããã€ãã£ãJavaScriptãœãªã¥ãŒã·ã§ã³ãšæ¯èŒããŠãããããªããã©ãŒãã³ã¹ãªãŒããŒãããããããŸãã
æªæ¥ãžã®å±æïŒçã®ãªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ã¯ïŒ
ãã®æ©èœã®æç¢ºãªå¿ èŠæ§ãèãããšãTC39å§å¡äŒïŒJavaScriptãæšæºåããã°ã«ãŒãïŒã¯ããªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ã®ããã®å°çšæŒç®åã远å ããããšãæ€èšããã®ã§ããããïŒçãã¯ã€ãšã¹ãè°è«ã¯ãããŠããŸãã
ãããããã®ææ¡ã¯çŸåšæŽ»åããŠããããæ®µéãé²ãã§ããŸãããäž»ãªèª²é¡ã¯ããã®æ£ç¢ºãªåäœãå®çŸ©ããããšã§ããåŒ `a?.b = c;` ãèããŠã¿ãŸãããã
- ãã `a` ã `undefined` ã ã£ããã©ããªãã¹ããïŒ
- ä»£å ¥ã¯é»ã£ãŠç¡èŠãããã¹ããïŒãno-opãïŒïŒ
- ç°ãªãçš®é¡ã®ãšã©ãŒãã¹ããŒãã¹ããïŒ
- åŒå šäœã¯äœããã®å€ã«è©äŸ¡ãããã¹ããïŒ
ãã®ææ§ããšãæãçŽæçãªåäœã«ã€ããŠæç¢ºãªåæãåŸãããªãããšãããã®æ©èœãå®çŸããŠããªãäž»ãªçç±ã§ããä»ã®ãšãããäžèšã§è°è«ãããã¿ãŒã³ããå®å šãªããããã£å€æŽãåŠçããããã®æšæºçã§èªããããæ¹æ³ã§ãã
å®è·µçãªã·ããªãªãšãã¹ããã©ã¯ãã£ã¹
ããã€ãã®ãã¿ãŒã³ãæå ã«ããäžã§ãã©ã®ããã«ããŠé©åãªãã®ãéžæããã°ããã§ããããïŒããã«ç°¡åãªæ±ºå®ã¬ã€ãã瀺ããŸãã
ã©ã®ãã¿ãŒã³ããã€äœ¿ãã¹ããïŒæ±ºå®ã¬ã€ã
-
`if (obj?.path) { ... }` ã䜿çšããå ŽåïŒ
- 芪ãªããžã§ã¯ãããã§ã«ååšããå Žåã«ã®ã¿ããããã£ã倿Žãããã
- æ¢åã®ããŒã¿ããããããŠãããæ°ãããã¹ããããæ§é ãäœæããããªãã
- äŸïŒãŠãŒã¶ãŒã® 'lastLogin' ã¿ã€ã ã¹ã¿ã³ããæŽæ°ãããã'metadata' ãªããžã§ã¯ãããã§ã«ååšããå Žåã«éãã
-
`(obj.prop ||= {})...` ã䜿çšããå ŽåïŒ
- ãã¹ãååšããããšãä¿èšŒãããå Žåãäžè¶³ããŠããã°äœæããã
- çŽæ¥çãªãªããžã§ã¯ãã®ãã¥ãŒããŒã·ã§ã³ã«æµæããªãã
- äŸïŒèšå®ãªããžã§ã¯ããåæåããå ŽåããŸãã¯ãŸã ãã®ã»ã¯ã·ã§ã³ããªãå¯èœæ§ã®ãããŠãŒã¶ãŒãããã¡ã€ã«ã«æ°ããã¢ã€ãã ã远å ããå Žåã
-
Lodashã® `_.set` ã®ãããªã©ã€ãã©ãªã䜿çšããå ŽåïŒ
- ãã§ã«ãã®ã©ã€ãã©ãªã䜿çšããŠããã³ãŒãããŒã¹ã§äœæ¥ããŠããã
- å³å¯ãªã€ãã¥ãŒã¿ããªãã£ãã¿ãŒã³ã«åŸãå¿ èŠãããã
- é åã€ã³ããã¯ã¹ãå«ããããªãããè€éãªãã¹ãåŠçããå¿ èŠãããã
- äŸïŒReduxãªãã¥ãŒãµãŒã§ç¶æ ãæŽæ°ããã
Nullish Coalescing Assignment (`??=`) ã«ã€ããŠã®æ³šæ
è«çORä»£å ¥ (`||=`) æŒç®åã®è¿èŠªã§ãããNullish Coalescing Assignment (`??=`) ã«ã€ããŠèšåããããšãéèŠã§ãã`||=` ãããããåœå€ïŒ`undefined`ã`null`ã`false`ã`0`ã`''`ïŒã§ããªã¬ãŒããã®ã«å¯Ÿãã`??=` ã¯ããå³å¯ã§ã`undefined` ãŸã㯠`null` ã®å Žåã«ã®ã¿ããªã¬ãŒããŸãã
ãã®åºå¥ã¯ãæå¹ãªããããã£å€ã `0` ã空æååã§ããå¯èœæ§ãããå Žåã«éèŠã§ãã
ã³ãŒãäŸïŒ`||=` ã®èœãšã穎
const product = { name: 'Widget', discount: 0 }; // å²åŒãèšå®ãããŠããªãå Žåãããã©ã«ãã®å²åŒ10ãé©çšãããã product.discount ||= 10; console.log(product.discount); // åºå: 10 (äžæ£è§£ïŒå²åŒã¯æå³çã«0ã ã£ã)
ããã§ã¯ã`0` ãåœå€ã§ããããã`||=` ã誀ã£ãŠäžæžãããŠããŸããŸããã`??=` ã䜿çšãããšãã®åé¡ã解決ããŸãã
ã³ãŒãäŸïŒ`??=` ã®æ£ç¢ºã
const product = { name: 'Widget', discount: 0 }; // å²åŒãnullãŸãã¯undefinedã®å Žåã«ã®ã¿ããã©ã«ãå²åŒãé©çšããã product.discount ??= 10; console.log(product.discount); // åºå: 0 (æ£è§£ïŒ) const anotherProduct = { name: 'Gadget' }; // discount 㯠undefined anotherProduct.discount ??= 10; console.log(anotherProduct.discount); // åºå: 10 (æ£è§£ïŒ)
ãã¹ããã©ã¯ãã£ã¹ïŒãªããžã§ã¯ããã¹ãäœæããå ŽåïŒåæå€ã¯åžžã« `undefined` ã§ãïŒã`||=` ãš `??=` ã¯äºææ§ããããŸãããã ããæ¢åã®å¯èœæ§ã®ããããããã£ã«ããã©ã«ãå€ãèšå®ããå Žåã¯ã`0`ã`false`ã`''` ãªã©ã®æå¹ãªåœå€ãæå³ããäžæžãããªãããã«ã`??=` ãæšå¥šããŸãã
çµè«ïŒå®å šã§å ç¢ãªãªããžã§ã¯ã倿Žããã¹ã¿ãŒãã
ãã€ãã£ãã®ããªãã·ã§ãã«ãã§ã€ãã³ã°ä»£å ¥ãæŒç®åã¯å€ãã®JavaScriptéçºè ã«ãšã£ãŠã®åžæãªã¹ãé ç®ã§ã¯ãããŸããããã®èšèªã¯å®å šãªããããã£å€æŽãšããæ ¹æ¬çãªåé¡ã解決ããããã®åŒ·åã§æè»ãªããŒã«ããããæäŸããŠããŸããæ¬ èœããŠããæŒç®åã«é¢ããæåã®çåãè¶ ããŠèããããšã§ãJavaScriptãã©ã®ããã«æ©èœãããã«ã€ããŠããæ·±ãçè§£ããããšãã§ããŸãã
äž»ãªãã€ã³ãããŸãšããŸãããïŒ
- ãªãã·ã§ãã«ãã§ã€ãã³ã°æŒç®å (`?.`) ã¯ãã¹ããããããããã£ã®èªã¿åãã«ãããŠç»æçãªãã®ã§ãããèšèªã®åºæ¬çãªæ§æèŠåïŒ`lvalue` vs. `rvalue`ïŒã«ããä»£å ¥ã«ã¯äœ¿çšã§ããŸããã
- æ¢åã®ãã¹ã®ã¿ãæŽæ°ããå Žåãææ°ã® `if` ã¹ããŒãã¡ã³ããšãªãã·ã§ãã«ãã§ã€ãã³ã° (`if (user?.profile?.address)`) ãçµã¿åãããã®ãæãã¯ãªãŒã³ã§èªã¿ãããã¢ãããŒãã§ãã
- ãã¹ãååšããªãå Žåã«ãã®å Žã§äœæããŠä¿èšŒããã«ã¯ãè«çä»£å ¥æŒç®åïŒ`||=` ãŸãã¯ããå³å¯ãª `??=`ïŒãç°¡æœã§åŒ·åãªãã€ãã£ããœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
- ã€ãã¥ãŒã¿ããªãã£ãèŠæ±ããã¢ããªã±ãŒã·ã§ã³ããéåžžã«è€éãªãã¹ä»£å ¥ãæ±ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãLodashã®ãããªãŠãŒãã£ãªãã£ã©ã€ãã©ãªã宣èšçã§å ç¢ãªä»£æ¿ææ®µãæäŸããŸãã
ãããã®ãã¿ãŒã³ãçè§£ãããã€é©çšããããç¥ãããšã§ãããã¯ãªãŒã³ã§ã¢ãã³ã§ããã ãã§ãªããããå ç¢ã§ã©ã³ã¿ã€ã ãšã©ãŒãçºçãã«ããJavaScriptãæžãããšãã§ããŸããã©ãã»ã©ãã¹ããããŠããŠããã©ãã»ã©äºæž¬äžèœã§ãã£ãŠããããããããŒã¿æ§é ãèªä¿¡ãæã£ãŠæ±ããèšèšäžå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãã§ããŸãã